<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Controller para gerenciamento dos usuários
 *
 * @property \Doctrine\ORM\EntityManager $em Gerenciador de Entidade
 * @property Doctrine $doctrine Biblioteca ORM
 */
class Usuario extends AdminController {

    /**
     * Metodo para listar os usuarios cadastrados
     *
     * @param int $page Pagina inicial para listar os usuarios
     */
    public function index( $page = 0 ) {
        $findBy = array();
        if( isNotBlank( $this->input->post( 'login' ) ) ) {
            $findBy = array_merge( $findBy, array( 'login' => $this->input->post( 'login' ) ) );
        }
        if( isNotBlank( $this->input->post( 'senha' ) ) ) {
            $findBy = array_merge( $findBy, array( 'senha' => criptografaSenha( $this->input->post( 'senha' ) ) ) );
        }
        $offset = 0;
        if( $page != 0 ) {
            $offset = ($page-1)*LIMITE_PAGINACAO_ADMIN;
        }
        $lista = $this->doctrine->em->getRepository( 'Usuarios' )
                    ->findBy( 
                        $findBy, 
                        NULL, 
                        LIMITE_PAGINACAO_ADMIN, 
                        $offset
                    );
        $total = count($lista); 
        $this->assign('total', $total);
        $this->assign('lista', $lista);
        $this->display('usuario/index');
    }

    /**
     * Exibe a tela de inserção/atualização de usuários
     *
     * @param int $id Codigo do usuario que esta sendo editado ou null para cadastrar um novo
     * @property Doctrine $doctrine Biblioteca ORM
     */
    public function editar( $id = null ){
        // se tem codigo de usuario e o metodo é GET
        if( !empty( $id ) && $_SERVER['REQUEST_METHOD'] == 'GET' ) {
            // resgatamos o registro do banco
            $sql = "SELECT * from usuarios u "
                    . "INNER JOIN pessoas p ON p.id_pessoa = u.id_pessoa "
                    . "INNER JOIN enderecos e ON e.id_endereco = p.id_endereco "
                    . "WHERE u.id_usuario = $id";
            $stmt = $this->doctrine->em->getConnection()->prepare( $sql );
            $stmt->execute();
            
            $user = $stmt->fetchAll();
            // colocamos os dados na variavel $_POST
            $_POST = $user[0];
            //echoVarDump($_POST);exit;
            $data_nascimento = new \DateTime( $user[0]['data_nascimento'] );
            $_POST['data_nascimento'] = $data_nascimento->format( 'd/m/Y' );
            // tiramos a senha (está em MD5)
            unset( $_POST['senha'] );
        }
        $cidades = $this->doctrine->em->getRepository( 'Cidades' )->findBy( 
                array( 'id_estado' => ESTADO_RS )
            );
        $this->assign( 'usuarios_status', $this->getUsuariosStatus() );
        $this->assign( 'usuarios_perfis', $this->getUsuariosPerfis() );
        $this->assign( 'cidades', $cidades );
        // exibimos a tela de inserção/edição de usuarios
        $this->display( 'usuario/editar' );
    }

    /**
     * Insere um novo usuário ou salva as alterações feitas em um usuário existente
     *
     * @param int $id Código do Usuário ou null para um novo usuário
     */
    public function salvar( $id = null ) {
        $editAdicional = "";
        // se está editando (informou o código do usuário)
        if( !empty( $id ) ) {
            // se não informou a senha, então deixamos a mesma
            if( empty( $_POST['senha'] ) ){
                unset( $_POST['senha'] );
            }
        }
        // se tem senha enviada do formulario
        if( !empty( $_POST['senha'] ) ){
            // colocamos em MD5
            $_POST['senha'] = criptografaSenha( $_POST['senha'] );
            $editAdicional = ", senha = '".$_POST['senha']."'";
        }
        if( $_POST['numero'] == '' ) {
            $_POST['numero'] = null;
        }
        $daoEndereco = $this->saveOrUpdateEnderecoByUsuario( $_POST, $id );
        $_POST['id_endereco'] = $daoEndereco->get_id_endereco();
        $daoPessoa = $this->saveOrUpdatePessoaByUsuario( $_POST, $id );
        $dateTime = getDatetimeNow();
        if( !empty( $id ) ) {
            $sql = "UPDATE usuarios SET login = '".$_POST['login']."', data_alteracao = '".$dateTime->format('Y-m-d H:i:s')."', id_usuario_status = ".$_POST['id_usuario_status'].", id_usuario_perfil = ".$_POST['id_usuario_perfil']." $editAdicional WHERE id_usuario = $id";
        } else {
            $sql = "INSERT INTO usuarios(login, senha, data_alteracao, id_pessoa, id_usuario_status, id_usuario_perfil) VALUES('".$_POST['login']."', '".$_POST['senha']."', '".$dateTime->format('Y-m-d H:i:s')."', ".$daoPessoa->get_id_pessoa().", ".$_POST['id_usuario_status'].", ".$_POST['id_usuario_perfil'].")";
        }
        $stmt = $this->doctrine->em->getConnection()->prepare( $sql );
        $stmt->execute();
        redirect( 'admin/usuario/index' );
    }

    /**
     * Remove um usuário cadastrado
     *
     * @param int $id Código do usuário a ser removido
     */
    public function remover($id) {
        $daoUsuario = $this->doctrine->em->getRepository( 'Usuarios' )->find( $id );
        $daoPessoa = $this->doctrine->em->getRepository( 'Pessoas' )->find( $daoUsuario->get_id_pessoa() );
        $daoEndereco = $this->doctrine->em->getRepository( 'Enderecos' )->find( $daoPessoa->get_id_endereco() );
        $this->doctrine->em->remove( $daoEndereco );
        $this->doctrine->em->remove( $daoPessoa );
        $this->doctrine->em->remove( $daoUsuario );
        $this->doctrine->em->flush();
        redirect('admin/usuario/index');
    }
    
    ///////////////////////////////////////////////////////////////////
    
    private function saveOrUpdateEnderecoByUsuario( $post, $id_usuario = null ) {
        $dao = new Enderecos();
        
        if( !empty( $id_usuario ) ){
            // pegamos o registro do banco de dados
            $daoEndereco = $this->doctrine->em->getRepository( 'Enderecos' )->find( $id_usuario );
            if( isNotBlank( $daoEndereco ) ) {
                $daoUsuario = $this->doctrine->em->getRepository( 'Usuarios' )->find( $id_usuario );
                $dao = $this->doctrine->em->getRepository( 'Enderecos' )->find( $daoUsuario->get_id_pessoa() );
            }
        }
        populateForm( $dao, $post );
        $this->doctrine->em->persist( $dao );
        $this->doctrine->em->flush();
        return $dao;
    }
    
    private function saveOrUpdatePessoaByUsuario( $post, $id_usuario = null ) {
        $dao = new Pessoas();
        
        if( !empty( $id_usuario ) ){
            // pegamos o registro do banco de dados
            $daoUsuario = $this->doctrine->em->getRepository( 'Usuarios' )->find( $id_usuario );
            if(isNotBlank( $daoUsuario ) ) {
                $dao = $this->doctrine->em->getRepository( 'Pessoas' )->find( $daoUsuario->get_id_pessoa() );
            }
        }
        populateForm( $dao, $post );
        $dao->set_email( $post['login'] );
        $dao->set_data_alteracao( new \DateTime( "now" ) );
        $dao->set_data_nascimento( new DateTime(dataToDate($dao->get_data_nascimento())) );
        $dao->set_data_cadastro( new \DateTime( "now" ) );
        $this->doctrine->em->persist( $dao );
        $this->doctrine->em->flush();
        return $dao;
    }
    
    private function getUsuariosStatus() {
        return $this->doctrine->em->getRepository( 'UsuariosStatus' )->findAll();
    }
    
    private function getUsuariosPerfis() {
        return $this->doctrine->em->getRepository( 'UsuariosPerfis' )->findAll();
    }
}
/* End of file usuario.php */
/* Location: ./application/controllers/admin/usuario.php */